//------------------------------------------------------------------------------
// Fichiers d'ent�te utilis�s
//------------------------------------------------------------------------------
#include "PPMImageLoader.hpp"
#include <fstream>
#include "RGBImage.hpp"
#include "GrayImage.hpp"
#include <string>
#include <iostream>
#include "Tools/LoggerFile.hpp"

//------------------------------------------------------------------------------
// Définition de constantes
//------------------------------------------------------------------------------


namespace ImageAnalysis
{

	//----------------------------------------------------------------------
	// Constructeur
	//----------------------------------------------------------------------
	PPMImageLoader::PPMImageLoader()
	{

	}

	//----------------------------------------------------------------------
	// Destructeur
	//----------------------------------------------------------------------
	PPMImageLoader::~PPMImageLoader( )
	{

	}

	//----------------------------------------------------------------------
	//
	//----------------------------------------------------------------------
	Image* PPMImageLoader::LoadImage( const char * filename )
	{
		Image* image;
		bool colorImage;
		int imageWidth;
		int imageHeight;
		std::string line;

		// Ouverture du fichier
		std::ifstream file(filename);

		//test de la réussite de l'ouverture
		if (file.fail())
		{
			fprintf(stderr, "Impossible d'ouvrir le fichier '%s'.\n", filename);
			return 0;
		}

		// Lecture de l'entete et test de la réussite de celle-ci
		std::getline( file, line );
		Tools::ILogger::Log() << "premiere lecture" << "\n";
		if (line.substr(0,2)=="P5")
		{
			colorImage = false;
		}
		else if (line.substr(0,2)=="P5")
		{
			colorImage = true;
		}
		else
		{
			fprintf(stderr, "L'image n'est pas a un format PPM reconnu.\n");
			file.close();
			return 0;
		}

		// Lecture de la largeur et de la hauteur de l'image
		file>>imageWidth;
		file>>imageHeight;

		// Lecture de la taille de la palette (255) (non implémenté)
		std::getline( file, line );
		// Création de l'image en fonction du type de l'image (couleur ou noir et blanc)
		if( colorImage )
		{	image = new RGBImage(imageWidth, imageHeight); }
		else
		{	image = new GrayImage(imageWidth, imageHeight); }


		// Lecture des données de l'image pour la construction des pixels de l'image
		for( int j=imageHeight-1; j>=0; j--)
		{
			for( int i=0; i<imageWidth; i++)
			{
				if(colorImage)
				{
					unsigned char pixel[4];
					file >> pixel[0];
					file >> pixel[1];
					file >> pixel[2];
					pixel[3] = 255;
					image->SetPixel( i + j*imageWidth, pixel );
				}
				else
				{
					unsigned char pixel[1];
					file>>pixel[0];
					image->SetPixel( i + j*imageWidth, pixel );
				}
			}
			Tools::ILogger::Log() << "ajout de pixel" << "\n";
		}

		// Fermeture du fichier
		file.close();

		return image;
	}

}

